今天要來講的東西,主要是來自筆者以前看過很喜歡的文章(https://www.ithome.com.tw/node/59884 ),今天特地仔細研讀查了資料,跟自己的經驗比對,來彙整各方意見和案例給大家看看,所以是時候要來講古的時候了哈哈
初起呢,是小時候想從家裡的電腦砍掉一個程式,於是就去C:\Program Files
找到那支程式把他刪了,後來被曾學過一點資料處理爸爸發現,雖然他對現在電腦一竅不通(他停留在DOS時代XD),但他那時告訴我:
這個安裝軟體是像鎖螺絲釘一樣,要拿螺絲起子順時針轉才會鎖緊,拔掉的時候要照逆時針轉回去才可以完整拿掉,這是一個固定的程序步驟,如果直接砍掉資料本身,會像是把這釘子拔出一半,是不會完整移除的。
當時對這句話半信半疑,還是會乖乖地在解除安裝的時候去那個軟體的資料夾找uninstall.exe來解除安裝,直到有天我心血來潮在思考,uninstall.exe做的只是把他的資料夾砍掉嗎?或者更正確地來說,安裝檔做的只是把程式資料載到特定資料夾這麼簡單?直到有天我聽說登錄檔這回事,上網查了一下,才知道程式安裝反安裝才沒有這麼簡單勒~~~
不過當然,有些小程式就真的就是很簡單,他常常是我們自己寫出來的,例如今天我們寫個java把他編譯完的.class檔,這個.class只要有jvm環境移到哪都可以執行,或是像筆者以前一堂課一上課就要開好幾個網頁,自己寫個.bat檔一鍵開啟,這些程式沒有所謂的安裝。
然後有些是可攜式(protable)的綠色軟體,通常是一個壓縮檔,解開後也沒規定要放哪,裡面包括一些組件,直接開啟主程式就可以用了,幾乎不會寫入登錄檔,Windows內的程式集也看不到他,更精確一點可以說是在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
子鍵下找不到,本身規模很小很單純,也可以直接從隨身碟開啟,大部分不會對系統造成什麼影響。
那真正需要安裝的應用程式規模又有多大?下面分幾個項來討論:
通常是主程式.exe檔,雙擊可以開啟程式,會在C:\Program Files那支程式的主目錄下,連動很多元件一起運行,但越是大型的軟體常常會開多個資料夾放各種元件在裡面,安裝完多出來的資料夾可能四處散落,甚至還要安裝一個Hub來版控分配旗下的軟體,開頭引述的文章作者嚴立群就形容這叫「關係複雜」、「支離破碎」,常常主程式打開像是一個呼叫器,會呼叫其他所有需要運作的程序一並開啟。
這對效能有什麼好處倒不一定,常常是開發上設計需求,例如同廠牌的軟體可以一起共享的功能就額外擺出來等等,對往後的更新維護有時候是更方便,沒有深謀遠慮的設計邏輯就可能是更困難。
(之前有說對DLL的認識可以參考andyfu44大大的鐵人賽https://ithelp.ithome.com.tw/users/20125938/ironman/3047 )
通常是一些共享功能,這也算是物件導向,例如安裝Word有寫入一個開啟檔案的功能,那再安裝Excel的時候就可以指向那個dll的位置沿用他不用再重複寫一次,省空間也好管理…….
等等,好管理嗎?
例如我們可以在C:\Program Files\Common Files\microsoft shared
下找到一些微軟共享文件,裡面也有一些dll和其他各式各樣的共享資源。
想像你是個高中老師,你上課需要用一隻粉筆,你可以自己帶,當然也可以從教室黑板板溝找,當你發現教室沒有,可能自己放一支新式無煙但很容易斷的環保粉筆,你不知道數學老師上課習慣用耐用煙很多的舊式粉筆,下堂課數學老師上課看到可能換成他喜歡的,也可能不爽就不上課了,如果他換回舊式粉筆可能明天換你不開心,更別提如果哪天教學觀摩你們一起出現的話。
今天一個安裝檔也是,當他執行去你電腦看,他可能要先判斷這裡是不是有他需要的功能檔,如果有,跟他的版本相符嗎?沒有的話他要創建這個功能該寫在這裡還是自己的軟體目錄?更可怕的是更新的時候該把他覆蓋掉嗎?
或許可以讀取登錄檔數數多少程式也共用這個檔案,但我們不一定保證更新後其他程式也可以用這個版本的,這樣是覆蓋還是不覆蓋好!?怎麼裝個軟體可以這麼糾結啊啊啊~但是軟體會有自己的選擇方式,久而久之你也不確定系統會被寫成怎樣,所以前面嚴大大也說:
有時不只是「技術」問題而只是「機率」問題罷了。
有些是程式的配置文件或組態檔,紀錄你使用者自定義的設定偏好,有時候是要寫入登錄值,把設定記在HKCU\SOFTWARE
下等等,也讓系統知道有這個軟體的存在,後來也有軟體用XML格式把設定以資料庫的形式儲存。
所以你現在知道應用程式的東西很多,不只複製主目錄而已,安裝程序的運作就不是那麼簡單。我們引文的嚴大大說:「這是一個精巧──但脆弱的過程。」隨者你裝過的東西越來越多,某天突然當機或是裝不了某套軟體都有可能發生,只是這個時代下正在慢慢改進,我覺得身為一個資訊相關背景人士,總該試著了解這些,對自己用的系統有認識,以古為鏡注意自己寫的程式。
所以回歸正題,安裝應用程式到底在你的電腦發生什麼事,通常我們就是一直按是、同意、下一步就完成了,比較瑣碎的可能會問你一些選擇性功能要不要安裝,要裝到哪裡,要不要件建立捷徑或加入環境變數,還有要同意終端使用者授權合約等等,但在你看不到的地方,他大概是在做:
然而有些程式安裝後需要重新啟動電腦有幾個原因,例如需要替換複寫的.dll檔正在被其他程式執行,只能告訴Windows在電腦剛開機還沒執行其他程式前把他換掉,或者下載來的暫存資源正在執行這個安裝程序沒辦法自己刪除自己,或是一些登錄檔設定需要重啟才可以作用等等。
至於我們要解除安裝軟體則會需要用到該軟體的uninstall功能,從控制台的新增/移除程式按解除安裝也會執行,這是因為安裝軟體寫入的登錄檔有記錄下反安裝檔的位置,他在我們前面說的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
的軟體子鍵下,的UninstallString登錄值。
那直觀來講,反安裝所要做的就是跟安裝倒過來,把寫入的東西寫回原本的樣子嘛,我們可以在安裝的時候寫一個log紀錄他做了什麼,反安裝的時候就知道要怎麼倒回去,但這也不容易,比如前面的.dll檔究竟是刪好還是不刪好,我們不一定知道自己的電腦有哪套軟體還共用他,另外,一些設定資料和登錄檔的內容應該全部清除嗎?說不定哪天你又載回這套軟體又需要同樣的設定怎麼辦,有些軟體解除安裝後裝回來你會發現還是你之前配置的視窗,甚至有時候反安裝完你發現桌面的捷徑還尋掛在原處。
筆者曾經見過的一個例子就是SQL Server Management Studio 18跟Visual Studio的關係,他們互通VS 2017 shell,我們載載卸卸VS的時候不曉得裝了什麼又卸了什麼,VS 2017 shell最後有沒有被更新或是隨著VS卸載而移除,最後SSMS就出現神秘現象不能用了,詳情可以參考這篇:https://docs.microsoft.com/en-us/answers/questions/100131/can39t-open-sql-server-management-studio-18-34mru.html。
這就是不建議常常反覆裝卸軟體的原因,如果是小程式也可以裝protable版的,影響系統小,他會盡量把要用的資源都包在自己身上用自己的,寫入的登錄檔的內容也很少,甚至不留下什麼設定檔,有可攜式的特性,這樣的軟體很受人青睞,也有人開發程式專門把軟體綠化,不要用就直接砍掉整個資料夾就好,但不注意還是可能留下資料,裡如筆者先前安裝一個綠色軟體,我們開機自啟動的選項勾起來,後來有天砍掉程式後,工作管理員還是寫著開機要啟動他,這也就是先前提過的無用的登錄檔垃圾之一。
於是最後我們導出這個結論,除了升遷制度外,有人認為軟體也有個彼得定律,隨著軟體不斷開發越來越強大越來越新穎的功能,往往追求不斷提升性能卻忽略一些一開始可以忽略的問題,可能不是bug,也許是一種習慣,沒有深謀遠慮,最終我們的系統將充斥著很好很強大的軟體,但問題也多的程式,他們可能互相依賴卻不知道哪天會產生矛盾,造成所謂「系統不穩定」這個概括又抽象的詞彙。最後我們引用引文作者嚴立群大大的結論做結尾:
這就是為何很多人都會說:「能少裝一點軟體就別裝」,因為有時並不是軟體本身的問題──因為「安裝」這行為就是個問題。這問題無解,我們只能盡量避免而已。
今天講了很多,因為那篇文章我常常拿出來看,也綜合了其他知識,希望可以綜合整理完整的心得筆記,從軟體的安裝和反安裝來看軟體對系統的讀寫操作,對系統穩定性的影響。經過這幾篇文章過來,我們對在Windows上的問題有了一點頭緒,時時刻刻都在寫硬碟改登錄檔,如果在反覆裝卸軟體,這樣的系統長時間下來常常有問題,最後要走上重灌這條路。於是下篇開始,我們就正式進入下個環節,開始介紹一些Windows系統級常識,談談各種系統夾的意義,還有權限問題等等,做我們之後來Debug的先備知識吧。
參考資料:
https://www.ithome.com.tw/node/59884
https://blog.csdn.net/jia_xiaoxin/article/details/2923217
https://support.microsoft.com/en-us/topic/how-to-manually-remove-programs-from-the-add-remove-programs-list-49494159-d215-07b2-e4c7-050457b38352
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/503685/
https://www.ithome.com.tw/node/60091